/**
 * 地理位置服务类
 * 用于获取用户位置和逆地理编码
 */

class LocationService {
  /**
   * 获取用户当前位置
   * @param {Object} options 配置选项
   * @param {boolean} options.showLoading 是否显示加载提示
   * @param {string} options.type 定位类型，默认 'wgs84'
   * @returns {Promise<Object>} 返回位置信息
   */
  static async getCurrentLocation(options = {}) {
    const { showLoading = true, type = 'wgs84' } = options;

    return new Promise((resolve, reject) => {
      if (showLoading) {
        wx.showLoading({
          title: '正在获取位置...',
          mask: true
        });
      }

      wx.getLocation({
        type: type,
        success: (res) => {
          if (showLoading) {
            wx.hideLoading();
          }
          console.log('获取位置成功:', res);
          resolve({
            success: true,
            data: {
              latitude: res.latitude,
              longitude: res.longitude,
              accuracy: res.accuracy,
              altitude: res.altitude,
              speed: res.speed
            },
            message: '获取位置成功'
          });
        },
        fail: (error) => {
          if (showLoading) {
            wx.hideLoading();
          }
          console.error('获取位置失败:', error);
          reject({
            success: false,
            data: null,
            message: this.getLocationErrorMessage(error.errMsg)
          });
        }
      });
    });
  }

  /**
   * 逆地理编码 - 根据坐标获取地址信息
   * 使用微信小程序内置的逆地理编码API
   * @param {number} latitude 纬度
   * @param {number} longitude 经度
   * @returns {Promise<Object>} 返回地址信息
   */
  static async reverseGeocode(latitude, longitude) {
    return new Promise((resolve, reject) => {
      wx.request({
        url: 'https://apis.map.qq.com/ws/geocoder/v1/',
        method: 'GET',
        data: {
          location: `${latitude},${longitude}`,
          key: 'KACBZ-5KLK6-JU7SV-EYQPH-BWAUE-3PF7X', // 需要替换为实际的腾讯地图API Key
          get_poi: 1
        },
        success: (res) => {
          if (res.data.status === 0) {
            resolve({
              success: true,
              data: res.data.result,
              message: '逆地理编码成功'
            });
          } else {
            reject({
              success: false,
              data: null,
              message: res.data.message || '逆地理编码失败'
            });
          }
        },
        fail: (error) => {
          console.error('逆地理编码请求失败:', error);
          reject({
            success: false,
            data: null,
            message: '网络请求失败'
          });
        }
      });
    });
  }

  /**
   * 根据逆地理编码结果获取adcode
   * @param {Object} geocodeResult 逆地理编码结果
   * @returns {string|null} 返回adcode，如果获取失败则返回null
   */
  static getAdcodeFromGeocode(geocodeResult) {
    if (!geocodeResult || !geocodeResult.ad_info) {
      return null;
    }

    const addressInfo = geocodeResult.ad_info;
    
    // 优先使用区县级别的adcode
    if (addressInfo.adcode) {
      return addressInfo.adcode;
    }

    

    return null;
  }

  /**
   * 简化的城市匹配 - 基于坐标范围判断大概城市
   * 这是一个备选方案，当逆地理编码API不可用时使用
   * @param {number} latitude 纬度
   * @param {number} longitude 经度
   * @param {Array} cityList 城市列表
   * @returns {Object|null} 匹配的城市对象
   */
  static matchCityByCoordinates(latitude, longitude, cityList) {
    // 主要城市的坐标范围（简化版）
    const cityRanges = {
      '北京': { lat: [39.4, 40.2], lng: [115.7, 117.4] },
      '上海': { lat: [30.7, 31.9], lng: [120.8, 122.2] },
      '广州': { lat: [22.8, 23.6], lng: [112.9, 114.0] },
      '深圳': { lat: [22.4, 22.9], lng: [113.7, 114.6] },
      '杭州': { lat: [30.0, 30.5], lng: [119.8, 120.5] },
      '南京': { lat: [31.8, 32.2], lng: [118.4, 119.2] },
      '成都': { lat: [30.4, 30.9], lng: [103.8, 104.3] },
      '武汉': { lat: [30.3, 30.8], lng: [114.0, 114.6] },
      '西安': { lat: [34.0, 34.5], lng: [108.7, 109.2] },
      '重庆': { lat: [29.2, 29.9], lng: [106.2, 106.9] }
    };

    for (const [cityName, range] of Object.entries(cityRanges)) {
      if (latitude >= range.lat[0] && latitude <= range.lat[1] &&
          longitude >= range.lng[0] && longitude <= range.lng[1]) {
        // 在城市列表中查找匹配的城市
        const matchedCity = cityList.find(city => 
          city.name.includes(cityName) || cityName.includes(city.name)
        );
        if (matchedCity) {
          return matchedCity;
        }
      }
    }

    return null;
  }



  /**
   * 获取位置错误信息的中文描述
   * @param {string} errMsg 错误信息
   * @returns {string} 中文错误描述
   */
  static getLocationErrorMessage(errMsg) {
    const errorMap = {
      'getLocation:fail auth deny': '用户拒绝授权获取位置信息',
      'getLocation:fail system permission denied': '系统拒绝获取位置信息',
      'getLocation:fail location service unavailable': '位置服务不可用',
      'getLocation:fail location service disabled': '位置服务已禁用',
      'getLocation:fail location service timeout': '获取位置超时',
      'getLocation:fail location service network error': '网络错误',
      'getLocation:fail location service unknown error': '未知错误'
    };

    return errorMap[errMsg] || '获取位置失败，请检查网络连接或重新授权';
  }

  /**
   * 请求位置权限
   * @returns {Promise<boolean>} 是否授权成功
   */
  static async requestLocationAuth() {
    return new Promise((resolve) => {
      wx.getSetting({
        success: (res) => {
          if (res.authSetting['scope.userLocation'] === false) {
            // 用户之前拒绝了授权，引导用户手动开启
            wx.showModal({
              title: '位置权限',
              content: '需要获取您的位置信息来推荐附近城市，请在设置中开启位置权限',
              showCancel: true,
              cancelText: '取消',
              confirmText: '去设置',
              success: (modalRes) => {
                if (modalRes.confirm) {
                  wx.openSetting({
                    success: (settingRes) => {
                      resolve(settingRes.authSetting['scope.userLocation'] === true);
                    },
                    fail: () => {
                      resolve(false);
                    }
                  });
                } else {
                  resolve(false);
                }
              }
            });
          } else if (res.authSetting['scope.userLocation'] === undefined) {
            // 首次请求授权
            resolve(true);
          } else {
            // 已经授权
            resolve(true);
          }
        },
        fail: () => {
          resolve(false);
        }
      });
    });
  }
}

module.exports = LocationService;
